home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 7_2009-2012.ISO / data / zips / Function_D2181165152010.psc / Function Drawer / Class Modules / DeviceContext.cls < prev    next >
Text File  |  2010-04-07  |  10KB  |  274 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "DeviceContext"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15.  
  16. Private Const PS_NULL = 5
  17.  
  18. Private Type RGBQUAD
  19.         rgbBlue As Byte
  20.         rgbGreen As Byte
  21.         rgbRed As Byte
  22.         rgbReserved As Byte
  23. End Type
  24. Private Type BITMAPINFOHEADER '40 bytes
  25.         biSize As Long
  26.         biWidth As Long
  27.         biHeight As Long
  28.         biPlanes As Integer
  29.         biBitCount As Integer
  30.         biCompression As Long
  31.         biSizeImage As Long
  32.         biXPelsPerMeter As Long
  33.         biYPelsPerMeter As Long
  34.         biClrUsed As Long
  35.         biClrImportant As Long
  36. End Type
  37. Private Type BITMAPINFO
  38.         bmiHeader As BITMAPINFOHEADER
  39.         bmiColors As RGBQUAD
  40. End Type
  41. Dim bi As BITMAPINFO
  42. Dim dcHandle As Long
  43. Dim hdc As Long, hDIB As Long
  44.  
  45. Public Enum Qualities
  46.     QualityBlackOnWhite = 1
  47.     QualityWhiteOnBlack = 2
  48.     QualityNearisNeigbour = 3
  49.     QualityHalftoneOrBilinear = 4
  50. End Enum
  51.  
  52.  
  53. Const RC_PALETTE As Long = &H100
  54. Const SIZEPALETTE As Long = 104
  55. Const RASTERCAPS As Long = 38
  56.  
  57. Private Type PALETTEENTRY
  58. peRed As Byte
  59. peGreen As Byte
  60. peBlue As Byte
  61. peFlags As Byte
  62. End Type
  63.  
  64. Private Type LOGPALETTE
  65. palVersion As Integer
  66. palNumEntries As Integer
  67. palPalEntry(255) As PALETTEENTRY ' Enough for 256 colors
  68. End Type
  69.  
  70. Private Type GUID
  71. Data1 As Long
  72. Data2 As Integer
  73. Data3 As Integer
  74. Data4(7) As Byte
  75. End Type
  76.  
  77. Private Type PicBmp
  78. Size As Long
  79. Type As Long
  80. hBmp As Long
  81. hPal As Long
  82. Reserved As Long
  83. End Type
  84.  
  85. Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
  86. Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
  87. Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
  88. Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
  89. Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal iCapabilitiy As Long) As Long
  90. Private Declare Function GetSystemPaletteEntries Lib "gdi32" (ByVal hdc As Long, ByVal wStartIndex As Long, ByVal wNumEntries As Long, lpPaletteEntries As PALETTEENTRY) As Long
  91. Private Declare Function CreatePalette Lib "gdi32" (lpLogPalette As LOGPALETTE) As Long
  92. Private Declare Function SelectPalette Lib "gdi32" (ByVal hdc As Long, ByVal hPalette As Long, ByVal bForceBackground As Long) As Long
  93. Private Declare Function RealizePalette Lib "gdi32" (ByVal hdc As Long) As Long
  94. Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
  95. Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
  96. Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
  97. Private Declare Function WindowFromDC Lib "user32" (ByVal hdc As Long) As Long
  98. Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
  99.  
  100.  
  101. Private Declare Function CreatePatternBrush Lib "gdi32" (ByVal hBitmap As Long) As Long
  102. Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
  103. Private Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
  104.  
  105. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  106. Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long
  107. Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
  108. Private Declare Function CreateDIBSection Lib "gdi32" (ByVal hdc As Long, pBitmapInfo As BITMAPINFO, ByVal un As Long, ByVal lplpVoid As Long, ByVal Handle As Long, ByVal dw As Long) As Long
  109.  
  110. Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
  111. Public Sub Create(ByVal bpp As Long, ByVal Width As Long, ByVal Height As Long, Optional ByVal Planes As Long = 1)
  112.     Dispose
  113.     With bi.bmiHeader
  114.         .biBitCount = bpp
  115.         .biHeight = Height
  116.         .biWidth = Width
  117.         .biPlanes = Planes
  118.         .biSize = Len(bi.bmiHeader)
  119.         .biCompression = 0
  120.         
  121.     End With
  122.     dcHandle = CreateCompatibleDC(0)
  123.     hDIB = CreateDIBSection(dcHandle, bi, 0, 0, 0, 0)
  124.     SelectObject dcHandle, hDIB
  125. End Sub
  126. Friend Property Get Handle()
  127.     Handle = dcHandle
  128. End Property
  129. Public Sub Dispose()
  130.     DeleteObject hDIB
  131.     DeleteDC dcHandle
  132.     ReleaseDC WindowFromDC(dcHandle), dcHandle
  133. End Sub
  134.  
  135. Public Sub Clear(ByVal bgColor As Long)
  136.     Dim hPen As Long, hBrush As Long, OldPen As Long, OldBrush As Long
  137.     
  138.     hPen = CreatePen(PS_NULL, 0, 0)
  139.     hBrush = CreateSolidBrush(bgColor)
  140.     
  141.     OldPen = SelectObject(dcHandle, hPen)
  142.     OldBrush = SelectObject(dcHandle, hBrush)
  143.     
  144.     Rectangle dcHandle, 0, 0, Width, Height
  145.     
  146.     SelectObject dcHandle, OldPen
  147.     SelectObject dcHandle, OldBrush
  148.     
  149.     DeleteObject hPen
  150.     DeleteObject hBrush
  151. End Sub
  152.  
  153. Public Sub GetBitmap(ByVal hBitmap As Long, ByVal X As Long, ByVal Y As Long, ByVal Width As Long, ByVal Height As Long)
  154.  
  155.     Dim hPen As Long, hBrush As Long, OldPen As Long, OldBrush As Long
  156.     
  157.     hPen = CreatePen(PS_NULL, 0, 0)
  158.     hBrush = CreatePatternBrush(hBitmap)
  159.     
  160.     OldPen = SelectObject(dcHandle, hPen)
  161.     OldBrush = SelectObject(dcHandle, hBrush)
  162.     
  163.     Rectangle dcHandle, X, Y, Width, Height
  164.     
  165.     SelectObject dcHandle, OldPen
  166.     SelectObject dcHandle, OldBrush
  167.     
  168.     DeleteObject hPen
  169.     DeleteObject hBrush
  170.     
  171. End Sub
  172.  
  173. Public Function ConvertToBitmap(ByVal X As Long, ByVal Y As Long, ByVal Width As Long, ByVal Height As Long) As StdPicture
  174.     Set ConvertToBitmap = hDCToPicture(dcHandle, X, Y, Width, Height)
  175. End Function
  176.  
  177. Public Sub SetToDC(ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal Width As Long, ByVal Height As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal SrcWidth As Long, ByVal SrcHeight As Long, ByVal Quality As Long, ByVal OperationCode As Long)
  178.     StretchBlt hdc, X, Y, Width, Height, dcHandle, SrcX, SrcY, SrcWidth, SrcHeight, OperationCode
  179.     
  180. End Sub
  181.  
  182. Public Sub GetFromDC(ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal Width As Long, ByVal Height As Long, ByVal OperationCode As Long)
  183.     StretchBlt dcHandle, 0, 0, Width, Height, hdc, X, Y, Width, Height, OperationCode
  184.     'BitBlt dcHandle, 0, 0, Width, Height, hDC, X, Y, OperationCode
  185. End Sub
  186.  
  187. Private Sub Class_Terminate()
  188.     Dispose
  189. End Sub
  190.  
  191.  
  192. Private Function CreateBitmapPicture(ByVal hBmp As Long, ByVal hPal As Long) As Picture
  193.     Dim r As Long, pic As PicBmp, IPic As IPicture, IID_IDispatch As GUID
  194.     
  195.     'Fill GUID info
  196.     With IID_IDispatch
  197.     .Data1 = &H20400
  198.     .Data4(0) = &HC0
  199.     .Data4(7) = &H46
  200.     End With
  201.     
  202.     'Fill picture info
  203.     With pic
  204.     .Size = Len(pic) ' Length of Structure
  205.     .Type = vbPicTypeBitmap ' Type of Picture (bitmap)
  206.     .hBmp = hBmp ' Handle to bitmap
  207.     .hPal = hPal ' Handle to palette (may be null)
  208.     End With
  209.     
  210.     r = OleCreatePictureIndirect(pic, IID_IDispatch, 1, IPic)
  211.     
  212.     Set CreateBitmapPicture = IPic
  213. End Function
  214.  
  215. Private Function hDCToPicture(ByVal hDCSrc As Long, ByVal LeftSrc As Long, ByVal TopSrc As Long, _
  216.     ByVal WidthSrc As Long, ByVal HeightSrc As Long) As Picture
  217.     Dim hDCMemory As Long, hBmp As Long, hBmpPrev As Long, r As Long
  218.     Dim hPal As Long, hPalPrev As Long, RasterCapsScrn As Long, HasPaletteScrn As Long
  219.     Dim PaletteSizeScrn As Long, LogPal As LOGPALETTE
  220.     
  221.     'Create a compatible device context
  222.     hDCMemory = CreateCompatibleDC(hDCSrc)
  223.     'Create a compatible bitmap
  224.     hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc)
  225.     'Select the compatible bitmap into our compatible device context
  226.     hBmpPrev = SelectObject(hDCMemory, hBmp)
  227.     
  228.     'Raster capabilities?
  229.     RasterCapsScrn = GetDeviceCaps(hDCSrc, RASTERCAPS) ' Raster
  230.     'Does our picture use a palette?
  231.     HasPaletteScrn = RasterCapsScrn And RC_PALETTE ' Palette
  232.     'What's the size of that palette?
  233.     PaletteSizeScrn = GetDeviceCaps(hDCSrc, SIZEPALETTE) ' Size of
  234.     
  235.     If HasPaletteScrn And (PaletteSizeScrn = 256) Then
  236.         'Set the palette version
  237.         LogPal.palVersion = &H300
  238.         'Number of palette entries
  239.         LogPal.palNumEntries = 256
  240.         'Retrieve the system palette entries
  241.         r = GetSystemPaletteEntries(hDCSrc, 0, 256, LogPal.palPalEntry(0))
  242.         'Create the palette
  243.         hPal = CreatePalette(LogPal)
  244.         'Select the palette
  245.         hPalPrev = SelectPalette(hDCMemory, hPal, 0)
  246.         'Realize the palette
  247.         r = RealizePalette(hDCMemory)
  248.     End If
  249.     
  250.     'Copy the source image to our compatible device context
  251.     r = BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, LeftSrc, TopSrc, vbSrcCopy)
  252.     
  253.     'Restore the old bitmap
  254.     hBmp = SelectObject(hDCMemory, hBmpPrev)
  255.     
  256.     If HasPaletteScrn And (PaletteSizeScrn = 256) Then
  257.     'Select the palette
  258.     hPal = SelectPalette(hDCMemory, hPalPrev, 0)
  259.     End If
  260.     
  261.     'Delete our memory DC
  262.     r = DeleteDC(hDCMemory)
  263.     
  264.     Set hDCToPicture = CreateBitmapPicture(hBmp, hPal)
  265. End Function
  266.  
  267. Friend Property Get Width() As Long
  268.     Width = bi.bmiHeader.biWidth
  269. End Property
  270.  
  271. Friend Property Get Height() As Long
  272.     Height = bi.bmiHeader.biHeight
  273. End Property
  274.